package com.demo.java.OD201_250.OD223;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【找数字 or 找等值元素】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145919463
 */
public class OdMain {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(); // 行数
        int m = in.nextInt(); // 列数

        int[][] matrix = new int[n][m]; // 存储矩阵
        Map<Integer, List<int[]>> num_map = new HashMap<>(); // 用于存储每个元素的位置

        // 读取矩阵元素并存储在 num_map 中
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int num = in.nextInt();
                matrix[i][j] = num;

                // 存储当前元素的位置
                int[] pos = new int[]{i, j};
                List<int[]> tempList = num_map.getOrDefault(num, new ArrayList<>());
                tempList.add(pos);
                num_map.put(num, tempList);
            }
        }

        List<List<Integer>> resList = new ArrayList<>(); // 存储结果
        Map<String, Integer> memo = new HashMap<>(); // 存储已计算的距离

        // 对每个矩阵元素进行处理
        for (int i = 0; i < n; i++) {
            List<Integer> tempList = new ArrayList<>();
            for (int j = 0; j < m; j++) {
                int num = matrix[i][j];
                List<int[]> posList = num_map.get(num); // 获取当前元素的所有位置

                // 如果只有一个位置，返回 -1
                if (posList.size() == 1) {
                    tempList.add(-1);
                    continue;
                }

                int minDistance = Integer.MAX_VALUE; // 初始化最小距离为最大值
                for (int[] pos : posList) {
                    int row = pos[0];
                    int col = pos[1];

                    if (row == i && col == j) {
                        continue; // 跳过当前元素
                    }

                    String key = row + "," + col + "," + i + "," + j;
                    if (memo.containsKey(key)) {
                        minDistance = Math.min(minDistance, memo.get(key)); // 使用备忘录加速
                    } else {
                        int distance = Math.abs(row - i) + Math.abs(col - j); // 计算曼哈顿距离
                        memo.put(key, distance); // 存储计算结果
                        minDistance = Math.min(minDistance, distance);
                    }
                }

                tempList.add(minDistance);
            }
            resList.add(tempList);
        }

        // 输出结果
        System.out.println(resList);
    }
}